#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <math.h>
#include "float.h"

using namespace std;

long double err(long double aprox, long double real)
{
	return fabs(aprox - real)/fabs(real);
}

int main()
{	
	Float a, b, c, d, res;
	
	for (int t = 10; t <= 60; t+=5)
	{
		cout.precision(t);
		a = Float(t, 25.0);
		b = Float(t, 50.0);
		c = Float(t, 1238.53498);
		d = Float(t, 5367.124701);
		
		cout << "t: " << t << " a: " << a.value() << " b: " << b.value() << " c: " << c.value() << " d: " << d.value() << endl;
		//~ cout << " a + b: " << (a + b).value() << " a.c: " << (a*c).value() << " a/d: " << (a/d).value();
		//~ cout << " c*d: " << (c/d).value() << " a*b/c*d: " << (a*b/c*d).value() << endl;
		//~ 
		//~ cout << " a + b: " << Float(t, a.value() + b.value()).value() << " a.c: " << Float(t, a.value() * c.value()).value() << " a/d: ";
		//~ cout << Float(t, a.value() / d.value()).value() << " c*d: " << Float(t, c.value() / d.value()).value();
		//~ cout << " a*b/c*d: " << Float(t, (a.value() * b.value())/(c.value() * d.value())).value() << endl;
		
		/* Mostrar los errores relativos. Esto es medio trucho porque lo que estoy tomando como real en realidad no es el real posta. */
		cout << " a + b: " << err((a + b).value(), Float(t, a.value() + b.value()).value()) << endl;
		cout << " a.c: " << err((a*c).value(), Float(t, a.value() * c.value()).value()) << endl;
		cout << " a/d: " << err((a/d).value(), Float(t, a.value() / d.value()).value()) << endl;
		cout << " c*d: " << err((c/d).value(), Float(t, c.value() / d.value()).value()) << endl;
		//~ cout << " a*b/c*d: " << err((a*b/c*d).value(), Float(t, (a.value() * b.value())/(c.value() * d.value())).value()) << endl << endl;
	}	
    return 0;
}
